package com.lafabrick.events
{
	
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	
	
	/**
	 * Dispatcher pour les évenements de type FabrickEvent
	 */
	public class FabrickEventDispatcher
	{
		private static var instance : FabrickEventDispatcher;
		private var eventDispatcher : IEventDispatcher;
		
		/**
		 * Retourne l'instance du dispatcher
		 */
		public static function getInstance() : FabrickEventDispatcher
		{
			if ( instance == null )
				instance = new FabrickEventDispatcher();
				
			return instance;
		}
		
		/**
		 * Constructeur
		 */
		public function FabrickEventDispatcher( target : IEventDispatcher = null )
		{
			eventDispatcher = new EventDispatcher( target );
		}
		
		/**
		 * Ajout d'un écouteur.
		 * @param type:String Le nom de l'événement.
		 * @param listener:Function La fonction déclenché par l'événement
		 * @param useCapture:Boolean [optionnel]
		 * @param priority:int [optionnel] Priorité de l'événement.
		 * @param useWeakReference:Boolean [optionnel] Détermine si la référence a l'écouteur est fort (true) ou faible (false). <br />Une référence forte empêche l'écouteur de s'insérer dans la zone mémoire tampon.
		 */
		public function addEventListener( type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
		{
			eventDispatcher.addEventListener( type, listener, useCapture, priority, useWeakReference );
		}
		
		/**
		 * Détruit un écouteur.
		 * @param type:String Le nom de l'événement.
		 * @param listener:Function La fonction déclenché par l'événement
		 * @param useCapture:Boolean [optionnel]
       */
		public function removeEventListener( type:String, listener:Function, useCapture:Boolean = false ) : void 
		{
			eventDispatcher.removeEventListener( type, listener, useCapture );
		}

		/**
		 * Dispatche un événement Fabrick.
		 * @param event:FabrickEvent Evénement Fabrick.
		*/
		public function dispatchEvent( event:FabrickEvent ) : Boolean 
		{
			return eventDispatcher.dispatchEvent( event );
		}

		/**
		 * Retourne l'existance d'un écouteur (true / false).
		 * @param type:String Le nom de l'écouteur.
		 */
		public function hasEventListener( type:String ) : Boolean 
		{
			return eventDispatcher.hasEventListener( type );
		}
  
		/**
		 * Retourne si un évenement est déclenché (true / false).
		 * @param type:String Le nom de l'écouteur.
		 */
		public function willTrigger(type:String) : Boolean 
		{
			return eventDispatcher.willTrigger( type );
		}
	}
}